package com.stylefeng.guns.core.util;

import java.math.BigDecimal;
 
/**
 * Double类型数据运算工具类（提供精确运算的加减乘除方法）
 * @author 
 *
 */
public class DoubleArithUtil {
	
	/**
	 * 加法运算
	 * @param x 被加数
	 * @param y 加数
	 * @return 两数的和
	 */
	public static double add(double x, double y) {
		BigDecimal vala = new BigDecimal(Double.toString(x));
		BigDecimal valb = new BigDecimal(Double.toString(y));
		return vala.add(valb).doubleValue();
	}
	
	/**
	 * 减法运算
	 * @param x 被减数
	 * @param y 减数
	 * @return 两数的差
	 */
	public static double subtract(double x, double y) {
		BigDecimal vala = new BigDecimal(Double.toString(x));
		BigDecimal valb = new BigDecimal(Double.toString(y));
		return vala.subtract(valb).doubleValue();
	}
	
	/**
	 * 乘法运算
	 * @param x 被乘数
	 * @param y 乘数
	 * @return 两数的积
	 */
	public static double multiply(double x, double y) {
		BigDecimal vala = new BigDecimal(Double.toString(x));
		BigDecimal valb = new BigDecimal(Double.toString(y));
		return vala.multiply(valb).doubleValue();
	}
	
	/**
	 * 除法运算(结果进行四舍五入)
	 * @param x 被除数
	 * @param y 除数
	 * @param scale 小数精确位数
	 * @return 两数的商
	 * @throws ArithmeticException
	 */
	public static double divide(double x, double y, int scale) throws ArithmeticException {
		if (scale < 0) {
			throw new ArithmeticException("精确度不能小于0");
		}
		
		BigDecimal vala = new BigDecimal(Double.toString(x));
		BigDecimal valb = new BigDecimal(Double.toString(y));
		return vala.divide(valb, scale, BigDecimal.ROUND_HALF_EVEN).doubleValue();
	}
 
}